server = {};
server.url = '/demo';
server.page = 1;// 默认选中页
server.pageSize = 20; // 默认返回量
server.showSize = 10;//中间页显示的数量
server.defaultNullValue='--';	// 列表中 如果值为空null时 显示的符号
server.editType = 'edit';//编辑页面
server.newType = 'new';//新增页面
server.pageType = 'type';//页面类型
server.currentPage;//当前页数
server.total;//记录总数
//server.ase_key = CryptoJS.enc.Utf8.parse("4982639785615407");//加密key
server.loadContentPage = function(url, obj, selector) {
	$.ajax({
		url : server.url + url,
		type : 'GET',
		success : function(data) {
			$(selector).html(data);
		},
		dataType : 'html',
		async : true
	});
	
	//设置页面头部信息
	server.headerSetValue(".header-title h6",obj);
	//设置面包屑导航信息
	server.breadcrumbSetValue("att_p","att",".breadcrumb",obj);
}

//绑定页面头部信息
server.headerSetValue = function(selector,obj){
	var $obj = $(obj);
	var headerName = $obj.text();
	$(selector).html(headerName);
}

//绑定面包屑导航信息
server.breadcrumbSetValue1 = function(attr1,attr2,selector,obj){
	var breadcrumbName = '';
	//attr1: 自定义的属性，代表一组菜单，即父子级关系
	var attr = $(obj).attr(attr1);
	//找到父子级菜单
	var menua =  $("#sidebar .sidebar-menu li a["+ attr1 +"='"+ attr +"']");
	
	menua.each(function(index, item){
		var myname = $(item).text();
		//attr2：自定义的属性值为链接地址
		var myhref = $(item).attr(attr2);
		if(myhref == null){
			myhref = "#";
		}
		var icons = '';
		if(index == 0){
			var icons = '<i class="fa fa-home"> </i>';
		}
		if(menua.length==(index + 1)){
			breadcrumbName += '<li class="active">'+icons+ myname +'</li>';
		}else{
			breadcrumbName += '<li>'+ icons +'<a href="#">'+ myname +'</a></li>';
		}
	});
	$(selector).html(breadcrumbName);
}

server.breadcrumbSetValue = function(attr1,attr2,selector,obj){
	var breadcrumbName = '';
	//attr1: 自定义的属性，attr_p：代表父级节点的id
	var currentName = $(obj).text();
	var attr = $(obj).attr(attr1);
	var icons = '';
	if(attr == '0'){
		icons = '<i class="fa fa-home"> </i>';
		breadcrumbName = '<li class="active">'+icons+ currentName +'</li>';
		$(selector).html(breadcrumbName);
		return;
	}else{
		breadcrumbName = '<li class="active">'+icons+ currentName +'</li>';
	}
	setBreadName(attr1,attr2,selector,attr,breadcrumbName);
}
//递归方法
/**
 * 设置面包屑导航 
 * @param attr1 ： att_p:存放父菜单的id属性
 * @param attr2：  att: 存放当前菜单的属性
 * @param selector：将内容插入到的节点
 * @param attr ： 当前父节点的id
 * @param breadcrumbName：返回的内容
 * @returns
 */
function setBreadName(attr1,attr2,selector,attr,breadcrumbName){
	var parentMenua =  $("#sidebar .sidebar-menu li a["+ attr2 +"='"+ attr +"']");
	currentName = parentMenua.text();
	attr = parentMenua.attr(attr1);
	if(attr == "0"){
		icons = '<i class="fa fa-home"> </i>';
		breadcrumbName = '<li>'+ icons +'<a href="#">'+ currentName +'</a></li>' + breadcrumbName;
		$(selector).html(breadcrumbName);
		return;
	}else{
		breadcrumbName = '<li><a href="#">'+ currentName +'</a></li>' + breadcrumbName;
		setBreadName(attr1,attr2,att,breadcrumbName);
	}
}

/**
 * 
 * 通用加载列表数据方法
 * obj对象包含属性如下: 
 * url-请求后台list列表数据路径
 * 
 **/
server.ajaxLoadTableList = function(obj){
	// 1- 参数检查
	server.paginationImportParamsCheck(obj);
	// 2-异步请求
	$.ajax({
		url : obj.url,	//数据请求url路径
		type : 'POST',	
		data : obj.params,	// 传递的查询参数
		success : function(data) {
			console.log(data)
			// 2-1 构建数据列表
			server.paginationDataTableBuild(obj,data.entity);
			// 2-2 解析并显示分页信息
			server.buildPageInfo(obj.paginationFooter,data.entity);
			// 2-3 解析并显示分页条
			server.buildPageNav(obj.paginationFooter,data.entity);
		},
		error : function(){
		},
		dataType : 'json',
		async : true
	});
}

/**
 * 必填项参数 相关校验, 供server.ajaxLoadList函数使用
 * obj-前台传递过来的对象
 */
server.paginationImportParamsCheck = function(obj){
	// 1- url校验
	if(verify.isNull(obj.url)){
		server.alert('url 未定义!');
		return;
	}
	// 2- table id和 页数div id 校验
	if(verify.isNull(obj.paginationTable)){
		server.alert('paginationTable 未定义!');
		return;
	}
	if(obj.columns == null || obj.columns.length < 1){
		server.alert('columns 未定义!');
		return;
	}
	// 页码, 如果没有传进来页码, 则使用 被选中（即当前页）, 如果没有被选中 则使用server.page的默认值
	if(obj.params.page == null || obj.params.page < 1){
		var tmpPage = $('#'+obj.paginationFooter+' ul li.active a').html();
		if(tmpPage != null){
			obj.params.page = tmpPage;
		}else{
			obj.params.page = server.page;
		}
	}
	// 返回量如果没有传进来, 则使用server.pageSize的默认值
	if(obj.params.pageSize == null || obj.params.pageSize < 1){
		obj.params.rows = server.pageSize;
	}
	if(obj.checkbox == null){
		obj.checkbox = false;
	}
}


/**
 * 列表数据 显示 构建函数 供server.ajaxLoadList 函数使用
 * paginationTable--table id
 * columns 前台定义的要显示的数据列, [{},{}] 格式的
 * data 后台返回的数据列
 * 数据格式：data.entity,存入的变量名称应为entity
 */
server.paginationDataTableBuild = function(obj, data){
	// 接收返回数据, 拼接成对应的html结构
	var totalColumns = obj.columns.length;	// 总列数
	var tbodyContent = '';
	// 1- 构建thead
	tbodyContent += '<thead><tr>';
	// 检查复选框是否有赋值
	if(obj.checkbox){
		tbodyContent += '<th style="width:20px;"><div class="checkbox"><label><input type="checkbox" class="colored-blue" name="ckbAll" title="全选" onclick="server.ckbSelect(this,\'' + obj.paginationTable + '\');"><span class="text"></span></label></div></th>';// 复选框列
		totalColumns ++;
	}
	tbodyContent += '<th style="width:50px;">序号</th>';//序号列
	totalColumns++;
	$.each(obj.columns,function(index,item){
		tbodyContent += '<th ';
		//  如果有宽度属性, 则使用自定义的宽度
		if(item.width > 0){
			tbodyContent += 'style="width:'+item.width+'px;"';
		}
		tbodyContent += '>' + item.title + '</th>';
	});
	tbodyContent += '</tr></thead>';
	// 2- 构建数据列表
	tbodyContent += '<tbody>'
	if(data.size == 0){
		tbodyContent += '<tr><td class="text-center" colspan="'+ totalColumns +'">没有查到匹配的数据, 换个查询条件再尝试一下?</td></tr>';
	}else{
		// 2-1 循环后台返回的数据列表, 来添加tbody中的tr
		$.each(data.list,function(index,item){
			// 2-1-1 循环前台定义个的多个列, 来添加tbody tr下的td
			tbodyContent += '<tr>';
			if(obj.checkbox){	//复选框列
				tbodyContent += '<td><div class="checkbox"><label><input type="checkbox" class="colored-blue" name="ckbItem" title="选中' + item.name + '进行删除" value="' + item.id + '" onclick="server.ckbSelect(this,\'' + obj.paginationTable + '\');"><span class="text"></span></label></div></td>';// 复选框列
			}
			tbodyContent += '<td>' + (data.startRow + index) + '</td>';	//序号列
			// 以下为对传进来的自定义对象 各个字段进行判断
			$.each(obj.columns,function(childIndex,childItem){
				// 一. 字段名和对应字段名的值
				var field = childItem.field;	// 字段名
				var value = server.defaultNullValue;	// 读取出来的的字段值
				// a- 如果传进来的字段名为  object.name 格式时, 则意味这为自定义对象,通过是否带有 . 来判断, 此时是要读取对象的属性值, 而不是直接传进来值
				if(field.indexOf('.') > 0){
					var filedArray = field.split('.',3);//属性只取三级
					var tmpObject = item[field.substring(0,field.indexOf('.'))];
					if(tmpObject != null){
						if(filedArray.length<=2){
							value = tmpObject[field.substring(field.indexOf('.')+1)];
						}else{
							tempObject1 = item[filedArray[0]+"."+filedArray[1]];
							if(tempObject1 != null){
								value= tempObject1[filedArray[2]];
							}
						}
					}
				}else{
				// b- 非自定义对象
					if(item[field] != undefined && item[field] != null){
						// switch start
						switch(typeof(item[field])){
						case 'boolean':
							if(item[field]){
								value = '是';
							}else{
								value = '否';
							}
							break;
						case 'number':
							value = item[field];
							break;
						case 'string':
							value = item[field];
							break;
						default:
							// 其他的undefined, null, object, function等对象统统不予以处理, 因为那是方法使用者 参数给错啦!!!
							break;
						}
						// switch end
					}
					
				}
				// 二. 处理可能存在的formatter函数
				if(childItem.formatter != null){
					// 参数①为当前字段值, 参数②为当前行的数据对象 
					// 为对象.属性 时
					if(field.indexOf('.') > 0){
						var tmpObject = item[field.substring(0,field.indexOf('.'))];
						if(tmpObject != null){
							value = childItem.formatter(tmpObject[field.substring(field.indexOf('.')+1)],item);
						}
					}else{
						// 为字段时
						value = childItem.formatter(item[field],item);
					}
				}
				tbodyContent += '<td>' + value + '</td>';
			});
			tbodyContent += '</tr>';
		});
	}
	tbodyContent += '</tbody>'
	$('#'+obj.paginationTable).html(tbodyContent);
}


/**
 * 数据列第一列 复选框勾选动作
 * obj - 被点击的checkbox对象
 * tableId - 数据table id
 */ 
server.ckbSelect = function(obj,tableId) {
	var name = $(obj).attr('name');
	if ('ckbAll' == name) {
		// 1- 如果为全选复选框
		var isAllSelect = false;
		if ($(obj).prop('checked')) { // 全选
			isAllSelect = true;
		} else { // 取消全选
			isAllSelect = false;
		}
		$("#" + tableId + " tbody tr td input[name='ckbItem']").each(function() {
			$(this).prop('checked', isAllSelect);
		});
	} else if ('ckbItem' == name) {
		// 2- 如果为列表中的复选框
		var ckbChecked = $("#" + tableId + " tbody tr td input[name='ckbItem']:checked").length;//已经被选中的数量
		// 2-1 如果选中数和总数相等  则 全选复选框被选中
		var isAllSelect = false;
		var ckbAllNum = $("#" + tableId + " tbody tr td input[name='ckbItem']").length;	// tbody中所有的行数
		if(ckbChecked == ckbAllNum){
			isAllSelect = true;
		}else{
			isAllSelect = false;
		}
		$("#" + tableId + " thead tr th input[name='ckbAll']").prop('checked',isAllSelect);
	} else {
		server.alert('数据列表中的复选框命名错误, 请联系管理员.');
	}

}

// 2-2、解析并显示分页信息
server.buildPageInfo = function(paginationFooter,data) {
	// 分页显示信息
	var pageNum = data.pageNum;	//当前页
	var totalPage = data.pages;	//总页数
	$("#" + paginationFooter + " .pagination-total-info").empty();
	$("#" + paginationFooter + " .pagination-total-info").append('显示第 '+ data.startRow +' 至 '+ data.endRow +' 项结果，共 '+ data.total +' 项');
	server.total = data.total;
}

// 2-3、解析并显示分页条
server.buildPageNav = function(paginationFooter,data) {
	var pageInfo = data;
	$("#" + paginationFooter + " .pagination").empty();
	var ul = $("#" + paginationFooter + " .pagination");
	// 首页
	var firstPage = $("<li></li>").append(
			$("<a></a>").append("首页").attr("href", "#"));
	// 上一页
	var prePage = $("<li></li>").append(
			$("<a></a>").append("&laquo;").attr("href", "#"));
	if (pageInfo.hasPreviousPage == false) {
		firstPage.addClass("disabled");
		prePage.addClass("disabled");
	} else {
		// 为元素添加点击翻页的事件
		firstPage.click(function() {
			common.paginationQuery(1);
		});
		prePage.click(function() {
			common.paginationQuery(pageInfo.pageNum - 1);
		});
	}
	ul.append(firstPage).append(prePage);

	// 中间页
	var nums = pageInfo.navigatepageNums;
	server.currentPage = pageInfo.pageNum;
	$.each(nums, function(i, item) {
		var middlePage = $("<li></li>").append(
				$("<a></a>").append(item).attr("href", "#"));
		if (pageInfo.pageNum == item) {
			middlePage.addClass("active");
		}
		middlePage.click(function() {
			common.paginationQuery(item);
		});
		ul.append(middlePage);
	});

	// 下一页
	var nextPage = $("<li></li>").append(
			$("<a></a>").append("&raquo;").attr("href", "#"));
	// <!-- 末页 -->
	var endPage = $("<li></li>").append(
			$("<a></a>").append("末页").attr("href", "#"));

	if (pageInfo.hasNextPage == false) {
		nextPage.addClass("disabled");
		endPage.addClass("disabled");
	} else {
		nextPage.click(function() {
			common.paginationQuery(pageInfo.pageNum + 1);
		});
		endPage.click(function() {
			common.paginationQuery(pageInfo.pages);
		});
	}
	ul.append(nextPage).append(endPage);

	// 新增输入框查询按钮
	var inputLi = $("<li>至</li>");
	var input = $("<input />").attr("id", "pageSearch").attr("value",server.currentPage).addClass("pageSearch");
	input.css({"height":"30px","width":"35px","text-align":"center"});
	input.keyup(function(){
		this.value = this.value.replace(/[^\d]/g, '')
	});
	
	input.keydown(function(event){
		event = document.all ? window.event : event;
		if ((event.keyCode || event.which) == 13) {
			common.paginationQuery($("#pageSearch").val());
		}
	});
	
	ul.append(inputLi.append(input));
}


//**************模态框弹出*******************************

var dialog = new Object();
/**
 * 打开弹出页(get方法) - 没有自定义宽度则默认为1000px
 * url 向后台请求的路径, 不用加项目路径  格式为  '/manage/weixin/specialBuyer/add' 即可, 非空
 * title 弹出框的标题名; objectId-要编辑的对象id,如果为打开新建窗口则不用填
 */
server.openModalBox = function(url, title){
	$.ajax({
		url: server.url + url,
		type:'get',
		data:{},	// 此处放参数
		dataType:'html',
		beforeSend: function(){
		},
		success:function(data){
			// body内容
			dialog = bootbox.dialog({
			    title : title,
			    message : data,
			    className:'',
			    boxCss:{'width':'1000px'}
			});
		},
		error:function(){
			alert('打开页面发生错误, 请刷新页面重新尝试或者联系管理员进行解决.');
		}
	});
}

/**
 * 打开弹出页(get方法) - 2 有自定义宽度
 * url 向后台请求的路径, 不用加项目路径  格式为  '/manage/weixin/specialBuyer/add' 即可, 非空
 * title 弹出框的标题名; objectId-要编辑的对象id,如果为打开新建窗口则不用填
 * width 弹出框大小 数字类型
 */
server.openModalBox = function(url, title,width){
	$.ajax({
		url: server.url + url,
		type:'get',
		data:{},	// 此处放参数
		dataType:'html',
		beforeSend: function(){
		},
		success:function(data){
			// body内容
			dialog = bootbox.dialog({
			    title : title,
			    message : data,
			    className:'',
			    boxCss:{'width':width+'px'}
			});
		},
		error:function(){
			server.alert('打开页面发生错误, 请刷新页面重新尝试或者联系管理员进行解决.');
		}
	});
}
// 关闭弹出页, 暂时不指定modal容器的id
server.closeModalBox = function(){
	dialog.modal('hide');
//	dialog = null;
}

/**
 * 通用异步提交一个form表单方法, 一般用户新增或更新数据用
 * formId form表单id
 * url 表单提交后台后台对应接口
 * preCallback 提交前执行函数, 一般为校验函数
 * preCallbackParam 提交前执行函数参数, 暂时默认只有一个参数, 一般不用
 * suffixCallBack 提交后执行函数, 一般为校验函数
 * suffixCallBackParam 提交后执行函数参数, 暂时默认只有一个参数, 此函数后面可以跟任意多个回调函数(如果用不好或者看不懂回调函数的就不要调用)
 */
server.submitForm = function(formId, url, preCallback, preCallbackParam, suffixCallBack, suffixCallBackParam) {
	alert(0000000)
	// 1- 执行 提交函数前的异步函数
	if (!preCallback(preCallbackParam)) {
		alert(333333)
		return false;
	}
	//console.log($('#' + formId).serializeObject());
	// 2- 异步提交
	$.ajax({
		url : server.url + url,
		type : 'post',
		data : $('#' + formId).serialize(),
		dataType : 'json',
		beforeSend : function() {
		},
		success : function(data) {
			if (data.notice == true) {
				alert(1111111)
				server.alertSuccess(data.message);
				// 关闭可能存在的弹出窗口
				server.closeModalBox();
				// 执行回调函数
				suffixCallBack(suffixCallBackParam);
			} else {
				alert(222222)
				server.alert(data.message);
			}
		},
		error : function() {
			server.alert('操作发生错误, 请刷新页面重新尝试或者联系管理员进行解决.');
		}
	});
}

/**
 * 删除单条数据通用方法
 * objectId 数据id
 * url 删除功能后台对应接口, 不需要写项目根目录路径,  例如：/manage/weixin/specialBuyer/delete
 * callback 执行完删除后的回调函数
 * page 传入到回调函数callback的参数
 */
server.deleteObject = function(objectId, url,callback,param){
//	alert(objectId + ' : ' + url + ' : ' + callback + ' : ' + param);
	alertify.confirm("确定要删除此项吗？",function(){
		$.ajax({
			url : server.url + url,
			type : 'post',
			data : {
				'id' : objectId
			},
			dataType : 'json',
			success : function(data) {
				if (data.notice == true) {
					server.alertSuccess(data.message);
					callback(param);
				} else {
					server.alert(data.message);
				}
			},
			error : function() {
				server.alert('操作发生错误, 请刷新页面重新尝试或者联系管理员进行解决.');
			}
		});
	});	
}

/**
 * 批量删除
 * deleteBatchUrl 批量删除功能后台对应接口, 不需要写项目根目录路径, 例如：/manage/weixin/specialBuyer/delete
 * callback 执行完删除后的回调函数
 * page 传入到回调函数callback的参数
 */
server.deleteBatch = function(deleteBatchUrl, callback, param) {
	// 1- 判断是否有被选中的
	var ckbChecked = $("#data-table tbody tr td input[name='ckbItem']:checked").length;
	if (ckbChecked < 1) {
		server.alert("请选择要操作的项");
		return;
	}
	// 2- 组装参数
	var idArray = new Array();
	$("#data-table tbody tr td input[name='ckbItem']:checked")
			.each(function() {
				idArray.push($(this).val());
			});
	
	//console.log(aesEncArray(idArray));
	
	alertify.confirm('确实要删除此'+idArray.length+'项吗? 该操作不可恢复.',function(){
		// 3- 异步删除
		$.ajax({
			url : server.url + deleteBatchUrl,
			type : 'post',
			data : {
				idArray : idArray
			},
			traditional : true,
			dataType : 'json',
			beforeSend : function() {
			},
			success : function(data) {
				if(data.notice){
	    			server.alertSuccess(data.message);
					// 使用回调函数刷新当前页
					callback(param);
				} else {
					server.alert(data.message);
				}
			},
			error : function() {
				server.alert('操作发生错误, 请刷新页面重新尝试或者联系管理员进行解决.');
			}
		});
	});
}

//省市区change事件
server.selectChange = function(realSelector,proSelector,citySelector,disSelector){
	//省联动
	$(proSelector).change(function() {
		var curProvince = $(this).val();
		if (curProvince !== "") {
			if(realSelector != null && realSelector !=""){
				$(realSelector).val(curProvince);
			}
			server.laodInfoByareaCode(curProvince,"province",proSelector,citySelector,disSelector);
		} else {
			//如果省级选择空，则当前代码为空
			if(realSelector != null && realSelector !=""){
				$(realSelector).val("");
			}
			$(citySelector).empty().append('<option value="">--请选择城市--</option>');
			$(disSelector).empty().append('<option value="">--请选择地区--</option>');
		}
	});
	//市联动
	// 加载地区
	$(citySelector).change(function() {
		var curCity = $(this).val(); //
		if (curCity !== "") {
			if(realSelector != null && realSelector !=""){
				$(realSelector).val(curCity);
			}
			server.laodInfoByareaCode(curCity,"city",proSelector,citySelector,disSelector);
		}else{
			//如果城市选择空，则获取省级代码
			if(realSelector != null && realSelector !=""){
				$(realSelector).val($(proSelector).val());
			}
			$(disSelector).empty().append('<option value="">--请选择地区--</option>');
		}
	});
	
	$(disSelector).change(function() {
		var curDistrict = $(this).val();
		if(curDistrict !== ""){
			if(realSelector != null && realSelector !=""){
				$(realSelector).val(curDistrict);
			}
		}else{
			if(realSelector != null && realSelector !=""){
				$(realSelector).val($(citySelector).val());
			}
		}
	});
}

//省市区联动--根据areaCode加载信息
server.laodInfoByareaCode = function(areaCodeKey, areaType, proSelector,citySelector,disSelector) {
	$.ajax({
		url : server.url + "/public/areaCode",
		type : "GET",
		data : {
			"areaCode" : areaCodeKey
		},
		success : function(data) {
			if (areaType == "province") {
				//省变动，清除市区信息
				$(citySelector).empty().append('<option value="">--请选择城市--</option>');
				$(disSelector).empty().append('<option value="">--请选择地区--</option>');
			} else if (areaType == "city") {
				$(disSelector).empty().append('<option value="">--请选择地区--</option>');
			}
			var areaCodeList = data.areaCodeList;
			if (areaCodeList.length > 0) {
				for (var i = 0; i < areaCodeList.length; i++) {
					var opt = $("<option />");
					opt.val(areaCodeList[i].areaCode).text(
							areaCodeList[i].areaName);

					if (areaType == "province") {
						$(citySelector).append(opt);
					} else if (areaType == "city") {
						$(disSelector).append(opt);
					}
				}
			}
		}
	});
}

//***************** 时间控件 ******************************

/**
 * 获取当前年度的时间控件
 */
server.loadYearDatePick = function(selector, pos){
	var date = new Date();
	var currentYear = date.getFullYear();
	$(selector).datetimepicker({
        language:  'zh-CN',
        format : 'yyyy',
        weekStart: 1,
        todayBtn:  1,
		autoclose: 1,
		todayHighlight: 1,
		startView: 4,
		minView: 4,
		forceParse: 0,
		endDate:currentYear,
		startDate:currentYear - 5,
		pickerPosition: pos == null ? "bottom-left" :pos
    });
}

server.loadSecondDatePick = function(selector,pos){
	$(selector).datetimepicker({
        language:  'zh-CN',
        format : 'yyyy-mm-dd hh:ii:ss',
        weekStart: 1,
        todayBtn:  1,
		autoclose: 1,
		todayHighlight: 1,
		startView: 2,
		minView: 0,
		forceParse: 0,
		pickerPosition: pos == null ? "bottom-left" :pos
    });
}

//*****************提示代码***********************************
server.alertSuccess = function(msg){
	alertify.success(msg);
}

server.alertError= function(msg){
	alertify.error(msg);
}

server.alert = function(msg){
	alertify.alert(msg);
}
